import router from './router/index'
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
import { useUserStore } from '@/store/modules/user'
import { usePermissionStore } from '@/store/modules/permission'
import { closeWebSocket } from '@/utils/socket'
import storageRouter from './router/modules/storage'
import repairRouter from './router/modules/returnFactory'
import useCurrentRoleStore from '@/store/modules/current-role'

NProgress.configure({ showSpinner: false })

const whiteList = [
  '/login/index',
  '/login/roles',
  '/login/forget',
  '/login/resuccess',
  '/login/register',
  '/auth-redirect',
] // 设置白名单

const errorRouter = {
  path: '/:pathMatch(.*)',
  component: () => import('@/views/error/404.vue'),
  hidden: true,
}

router.beforeEach(async (to, from, next) => {
  const UserStore = useUserStore()
  const PermissionStore = usePermissionStore()
  //判断是登录则关闭连接删除登录记录token
  if (to.path == '/login/index') {
    closeWebSocket()
    window.localStorage.removeItem('saasState')
    PermissionStore.clearRoutes()
    useCurrentRoleStore().clearCurrentRole()
  }
  // 开启进度条
  NProgress.start()
  // 设置标题
  if (typeof to.meta.title === 'string') {
    document.title = to.meta.title || '售后服务'
  }
  // 确定用户是否已登录过，存在Token
  const hasToken = UserStore.row.tokenValue
  if (hasToken) {
    if (to.path === '/login/index') {
      if (!UserStore.token) {
        next()
      } else {
        next({ path: '/' })
      }
      // 如果已登录，请重定向到主页
    } else {
      try {
        // 路由添加进去了没有及时更新 需要重新进去一次拦截
        if (!PermissionStore.routes.length && UserStore.token) {
          // 获取权限列表进行接口访问 因为这里页面要切换权限
          const accessRoutes = await PermissionStore.generateRoutes(UserStore.roles)
          if (Array.isArray(accessRoutes)) {
            accessRoutes.forEach((item) => {
              router.addRoute(item)
            }) // 动态添加访问路由表
            router.addRoute(errorRouter) // 添加404路由
          }

          next({ ...to, replace: true }) // // 这里相当于push到一个页面 不在进入路由拦截
        } else {
          next() // 如果不传参数就会重新执行路由拦截，重新进到这里
        }
      } catch (error) {
        next('/login/index')
      }
    }
  } else {
    PermissionStore.clearRoutes()
    useCurrentRoleStore().clearCurrentRole()

    // 如果是OA点击链接直接跳转到配件申请单详情页、返厂详情页，就免去登录
    if (
      to.path.includes('/storage/spare/part/apply/detail') ||
      to.path.includes('/return/factory/detail')
    ) {
      // 判断是否已经添加过路由 (避免重复添加)
      if (!router.hasRoute('sparePartApplyDetail')) {
        // 使用路由name验证
        // 仅添加父路由（子路由会自动继承）
        storageRouter.forEach((item) => router.addRoute(item))
        router.addRoute(errorRouter) // 确保404在最后
      }

      // 判断是否已经添加过路由 (避免重复添加)
      if (!router.hasRoute('returnFactoryDetail')) {
        // 使用路由name验证
        // 仅添加父路由（子路由会自动继承）
        repairRouter.forEach((item) => router.addRoute(item))
        router.addRoute(errorRouter) // 确保404在最后
      }

      // 强制重新导航（修复无限循环）
      if (to.matched.length === 0) {
        // 检查当前路径是否未被匹配
        next(to.path) // 重新触发路由解析
      } else {
        next() // 正常放行
      }
    } else if (whiteList.indexOf(to.path) !== -1) {
      router.addRoute(errorRouter) // 添加404路由
      next()
    } else {
      router.addRoute(errorRouter) // 添加404路由
      next('/login/index')
    }
  }
})

router.afterEach(() => {
  NProgress.done()
})
